﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpDbCommonEdit.h"
#include "ElementId.h"
#include <vector>
namespace gcmp
{
    class IDocument;
    class Vector3d;
    class IElement;
    class ILinkElementProxy;
    /// \brief 移动操作的工具类。
    class GCMP_DB_COMMON_EDIT_EXPORT MoveUtils
    {
    public:
        /// \brief 移动一组对象。
        /// \param pDocument 移动操作的文档。
        /// \param elementIdsToBeMoved 要移动的对象id
        /// \param moveVector 移动向量
        /// \param pError 错误信息
        /// \return 移动成功则返回true，否则返回false。
        static bool MoveElements(IDocument* pDocument, const std::vector<ElementId>& elementIdsToBeMoved, const Vector3d& moveVector, std::wstring* pError = nullptr);
        /// \brief 移动一个对象
        /// \param pElement 要移动的对象
        /// \param moveVector 移动向量
        /// \param pError 错误信息
        /// \return 移动成功则返回true，否则返回false
        static bool MoveElement(IElement* pElement, const Vector3d& moveVector, std::wstring* pError = nullptr);

        /// \brief 将主文档中的向量坐标变换为链接文档中的向量（控制点、移动向量等）
        /// \note 适用场景：链接文档非中心对齐、存在子项等情况，主文档的变更需要同步到链接文档中
        /// 
        /// \param srcVector 主文档中的向量
        /// \param transformedVector 变换后的向量（链接文档中正确的控制点、移动向量等）
        /// \param pElementProxy 修改的代理对象
        /// \return 变换成功返回true，否则返回false
        static bool TransformFromMainDocToLinkDoc(const Vector3d& sourceVector, const ILinkElementProxy* pElementProxy, Vector3d& transformedVector);

        /// \brief 将链接文档中的向量坐标变换为主文档中的向量（控制点、移动向量等）
        /// \note 适用场景：链接文档非中心对齐、存在子项等情况，链接文档中的变更需要同步到主文档中
        /// 
        /// \param srcVector 主文档中的向量
        /// \param transformedVector 变换后的向量（主文档中正确的控制点、移动向量等）
        /// \param pElementProxy 修改的代理对象
        /// \return 变换成功返回true，否则返回false
        static bool TransformFromLinkDocToMainDoc(const Vector3d& sourceVector, const ILinkElementProxy* pElementProxy, Vector3d& transformedVector);

    };
}
